package backTrack.p4_23;

public class Class37 {

    public void solveSudoku(char[][] board) {
        backTracking(board);

    }

    public  boolean  backTracking(char[][]  board){
        for (int i = 0; i <board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j]!='.') continue;
                for (char k = '1'; k <='9' ; k++) {
                    if (isValid(i,j,k,board)){
                        board[i][j]=k;
                        //  CKG TODO 2023/4/23:  这里要这样子做 数据才能写在棋盘上面  之前的都是这这个位置调用backTracking的时候 该函数前面都有收集结果的地方
                        //  CKG TODO 2023/4/23:   但是这个地方并没有地方收集结果 所以需要直接返回   此时是通过验证的 说明这一行的这个位置填上这个数是成立合法的
                        if (backTracking(board)){
                            return  true;
                        }

//                        backTracking(board);
                        board[i][j]='.';
                    }
                }
                return  false;

            }

        }
        return  true;
    }

    public  boolean isValid(int row,int col,char val,char[][] board){
        //  CKG TODO 2023/4/23: 判断行,里面是否有重复
        for (int i = 0; i < 9; i++) {
            if (board[row][i]==val){
                return false;
            }

        }
        //  CKG TODO 2023/4/23: 判断列里面是否有重复
        for (int i = 0; i <=9 ; i++) {
            if (board[i][col]==val){
                return false;
            }
        }
        //  CKG TODO 2023/4/23: 判断九宫格 里面是否有重复的
        int startRow=row/3*3;
        int startCol=col/3*3;
        for (int i = startRow; i <startRow+3 ; i++) {
            for (int j = startCol; j <startCol+3 ; j++) {
                if (board[i][j]==val){
                    return  false;
                }

            }

        }
        return  true;


    }



}
